package common

import (
	"encoding/json"
	"log"

	"github.com/hashicorp/consul/api"
)

// 定义一个map，key是字符串，value是api客户端或nil
var consulClients = make(map[string]*api.Client)

// 获取配置中心客户端
func getConsulClient(address string) (*api.Client, error) {
	// 1. 从map中获取客户端
	client := consulClients[address]
	// 2. 如果存在，则直接返回
	if client != nil {
		return client, nil
	}
	// 3. 如果不存在，则新建
	config := api.DefaultConfig()
	config.Address = address
	client, err := api.NewClient(config)
	if err == nil {
		consulClients[address] = client // 没有错误进行挂载
	}
	// 4. 返回
	return client, err
}

// 设置配置中心
func getConsulConfig(Address string, path string) (*api.KVPair, error) {
	// 1. 获取 Consul客户端
	client, clientErr := getConsulClient(Address)
	if clientErr != nil {
		log.Fatal(clientErr)
	}

	// 2. 创建KV客户端
	kv := client.KV()

	// 3. 基于path读取pair
	pair, _, getErr := kv.Get(path, nil)
	return pair, getErr
}

func GetConsulMysqlConfig(address string, path string) (MysqlConfig, error) {
	// 1. 获取 pair
	pair, consulErr := getConsulConfig(address, path)
	if consulErr != nil {
		log.Fatal(consulErr)
	}

	// 2. 解析JSON字符串为 MysqlConfig 结构体
	var mysqlConfig MysqlConfig
	err := json.Unmarshal(pair.Value, &mysqlConfig)
	return mysqlConfig, err
}
